cssnodedeclaration: Store the GType of the node
authorBenjamin Otte <otte@redhat.com>
Sun, 21 Dec 2014 19:26:26 +0000 (20:26 +0100)
committerBenjamin Otte <otte@redhat.com>
Wed, 7 Jan 2015 13:26:48 +0000 (14:26 +0100)
gtk/gtkcssnodedeclaration.c
gtk/gtkcssnodedeclarationprivate.h
gtk/gtkstylecontext.c

index 1c099304c072e3682508b195d13fc2f62df7e8d1..e5c718708ad9f0490b0a3aee7bbd3b2f94d7d3b2 100644 (file)
@@ -32,6 +32,7 @@ struct _GtkRegion
 struct _GtkCssNodeDeclaration {
   guint refcount;
   GtkJunctionSides junction_sides;
+  GType type;
   GtkStateFlags state;
   guint n_classes;
   guint n_regions;
@@ -160,6 +161,25 @@ gtk_css_node_declaration_get_junction_sides (const GtkCssNodeDeclaration *decl)
   return decl->junction_sides;
 }
 
+gboolean
+gtk_css_node_declaration_set_type (GtkCssNodeDeclaration **decl,
+                                   GType                   type)
+{
+  if ((*decl)->type == type)
+    return FALSE;
+
+  gtk_css_node_declaration_make_writable (decl);
+  (*decl)->type = type;
+
+  return TRUE;
+}
+
+GType
+gtk_css_node_declaration_get_type (const GtkCssNodeDeclaration *decl)
+{
+  return decl->type;
+}
+
 gboolean
 gtk_css_node_declaration_set_state (GtkCssNodeDeclaration **decl,
                                     GtkStateFlags           state)
@@ -426,7 +446,7 @@ gtk_css_node_declaration_hash (gconstpointer elem)
   GtkRegion *regions;
   guint hash, i;
   
-  hash = 0;
+  hash = (guint) decl->type;
 
   classes = get_classes (decl);
   for (i = 0; i < decl->n_classes; i++)
@@ -462,6 +482,9 @@ gtk_css_node_declaration_equal (gconstpointer elem1,
   if (decl1 == decl2)
     return TRUE;
 
+  if (decl1->type != decl2->type)
+    return FALSE;
+
   if (decl1->state != decl2->state)
     return FALSE;
 
index 767b6ecfb5c9ae2e955c92a69a521f61f046d92e..56323ac5063a7f7763282a992901bce675254b75 100644 (file)
@@ -33,6 +33,9 @@ void                    gtk_css_node_declaration_unref                  (GtkCssN
 gboolean                gtk_css_node_declaration_set_junction_sides     (GtkCssNodeDeclaration        **decl,
                                                                          GtkJunctionSides               junction_sides);
 GtkJunctionSides        gtk_css_node_declaration_get_junction_sides     (const GtkCssNodeDeclaration   *decl);
+gboolean                gtk_css_node_declaration_set_type               (GtkCssNodeDeclaration        **decl,
+                                                                         GType                          type);
+GType                   gtk_css_node_declaration_get_type               (const GtkCssNodeDeclaration   *decl);
 gboolean                gtk_css_node_declaration_set_state              (GtkCssNodeDeclaration        **decl,
                                                                          GtkStateFlags                  flags);
 GtkStateFlags           gtk_css_node_declaration_get_state              (const GtkCssNodeDeclaration   *decl);
index 747ad745c66992473aed8e1b6e6ed6c5796528c6..2b34d0d2e7d2499802e2a2cc97681239cf08666c 100644 (file)
@@ -881,6 +881,11 @@ _gtk_style_context_set_widget (GtkStyleContext *context,
 
   context->priv->widget = widget;
 
+  if (widget)
+    gtk_css_node_declaration_set_type (&context->priv->info->decl, G_OBJECT_TYPE (widget));
+  else
+    gtk_css_node_declaration_set_type (&context->priv->info->decl, G_TYPE_NONE);
+
   _gtk_style_context_update_animating (context);
 
   _gtk_style_context_queue_invalidate (context, GTK_CSS_CHANGE_ANY_SELF);
@@ -1373,10 +1378,17 @@ gtk_style_context_set_path (GtkStyleContext *context,
     {
       gtk_widget_path_free (priv->widget_path);
       priv->widget_path = NULL;
+      gtk_css_node_declaration_set_type (&context->priv->info->decl, G_TYPE_NONE);
     }
 
   if (path)
-    priv->widget_path = gtk_widget_path_copy (path);
+    {
+      priv->widget_path = gtk_widget_path_copy (path);
+      if (gtk_widget_path_length (path))
+        gtk_css_node_declaration_set_type (&context->priv->info->decl,
+                                           gtk_widget_path_iter_get_object_type (path, -1));
+    }
+
 
   _gtk_style_context_queue_invalidate (context, GTK_CSS_CHANGE_ANY);
 }